/* 
 * Nombre: RequerimientoAcademico.java                        
 * Version: 1.0.0                                             
 * Diagrama: GAPI v4.5.7                                      
 * Autor: Amado de Jesús Canté Cauich                         
 * Creado: 30-mar-2013                                        
 * Modificado: 02/04/2013                                   
 * Caso de uso: MGEDD1, MGEDD2, MGEDD3
 */
package Dominio;

import java.util.ArrayList;

/**
 * Clase que representa un reuqerimiento académico de una asignatura en el sistema
 * @author amado.cante
 */
public class RequerimientoAcademico {
    private Asignatura asignaturaDependiente;
    private ArrayList<Asignatura> asignaturasRequeridas;
    private int clavePrograma;

    /**
     * Método constructor
     * @param asignaturaDependiente - La asignatura dependiente
     * @param asignaturasRequeridas - Las asignaturas requeridas
     * @param clavePrograma - La clave del programa educativo
     */
    public RequerimientoAcademico(Asignatura asignaturaDependiente, ArrayList<Asignatura> asignaturasRequeridas, int clavePrograma) {
        this.asignaturaDependiente = asignaturaDependiente;
        this.asignaturasRequeridas = asignaturasRequeridas;
        this.clavePrograma = clavePrograma;
    }

    /**
     * Método constructor
     * @param asignaturaDependiente - La asignatura dependiente
     * @param asignaturaRequerida - La asignatura requerida
     * @param clavePrograma  - La clave del programa educativo
     */
    public RequerimientoAcademico(Asignatura asignaturaDependiente,Asignatura asignaturaRequerida, int clavePrograma) {
        this.asignaturaDependiente = asignaturaDependiente;
        this.clavePrograma = clavePrograma;
        this.asignaturasRequeridas = new ArrayList<Asignatura>();
        this.asignaturasRequeridas.add(asignaturaRequerida);
    }

    /**
     * Retona la asignatura dependiente
     * @return la asignatura dependiente
     */
    public Asignatura getAsignaturaDependiente() {
        return asignaturaDependiente;
    }

    /**
     * Asigna la asignatura dependiente
     * @param asignaturaDependiente - La asignatura dependiente
     */
    public void setAsignaturaDependiente(Asignatura asignaturaDependiente) {
        this.asignaturaDependiente = asignaturaDependiente;
    }

    /**
     * Reotna la lista de asignaturas requeridas asignaturas requeridas para la asignatura dependiente
     * @return la lista de asignaturas requeridas para la asignatura dependiente
     */
    public ArrayList<Asignatura> getAsignaturasRequeridas() {
        return asignaturasRequeridas;
    }

    /**
     * Asigna las asignaturas requeridas para la asignatura dependiente
     * @param asignaturasRequeridas - Las asignaturas requeridas para la asignatura dependiente
     */
    public void setAsignaturasRequeridas(ArrayList<Asignatura> asignaturasRequeridas) {
        this.asignaturasRequeridas = asignaturasRequeridas;
    }

    /**
     * Retorna la clave del programa educativo
     * @return la clave del programa educativo
     */
    public int getClavePrograma() {
        return clavePrograma;
    }

    /**
     * Asigna la clave del programa educativo
     * @param clavePrograma - La clave del programa educativo
     */
    public void setClavePrograma(int clavePrograma) {
        this.clavePrograma = clavePrograma;
    }
    /**
     * Método para verificar la inserción de una asignatura como requerida para la asignatura dependiente del RequerimientoAcademico.
     * Devuelve true si la asignatura fue insertada o false si la asignatura no fue insertada en cuyo caso se entiende que 
     * la asignatura ya se encontraba registrada como requerida.
     * @param asignatura La asignatura a ser insertada.
     * @return true si la asignatura es insertada o false si la asignatura no es insertada porque ya se encontraba en el listado.
     */
    public boolean agregaAsignaturaRequerida(Asignatura asignatura){
        if(!existeAsignatura(asignatura)){
            this.asignaturasRequeridas.add(asignatura);
            return true;
        }
        return false;
    }
    
    /**
     * Verifica si existe la asignatura entre las asignaturas requeridas
     * @param asignatura - La asignatura a verificar si existe entre las asignaturas requeridas
     * @return true si existe, false si no
     */
    protected boolean existeAsignatura(Asignatura asignatura){
        boolean existe = false;
        for(int i=0;i<this.asignaturasRequeridas.size();i++){
            if(this.asignaturasRequeridas.get(i).getClaveAsignatura() == asignatura.getClaveAsignatura() || 
                    this.asignaturasRequeridas.get(i).getNombre().equalsIgnoreCase(asignatura.getNombre())){
                existe = true;
                break;
            }
        }
        return existe;
    }
    
    /**
     * Imprime la información del requerimiento académico
     * @return la información del requerimiento académico
     */
    @Override
    public String toString(){
        String cadena="";
        cadena+="AsignaturaDependiente: "+this.getAsignaturaDependiente().toString()+"\n";
        ArrayList<Asignatura> requeridas = this.getAsignaturasRequeridas();
        if(requeridas.size()>0){
            for(int i=0;i<requeridas.size();i++){
                cadena+="\nRequerida "+i+": "+requeridas.get(i).toString()+"\n";
            }
        }else{
            cadena+="\n->Sin requerimientos <-\n";
        }
        return cadena;
    }
}
